package PureFactoryClasses;

import Filtros.Comparadores.Comparador;
import Filtros.Comparadores.CompararEsEmpresa;
import Filtros.Comparadores.CompararEsPersona;
import Filtros.Comparadores.CompararPorMatch;
import Filtros.Extractores.Extractor;
import Filtros.Extractores.ExtraerCadenaFija;
import Filtros.Extractores.ExtraerNombre;
import Filtros.Extractores.ExtraerRazonSocial;
import Filtros.Extractores.ExtraerRubros;
import Filtros.OperadoresLógicos.OperadorAND;
import Filtros.OperadoresLógicos.OperadorLógico;
import Filtros.OperadoresLógicos.OperadorOR;

/**
 *
 * @author mj
 */
public class FiltrosPracticosFactory {

    public static Comparador EsEmpresa() {
        return new CompararEsEmpresa();
    }

    public static Comparador EsPersona() {
        return new CompararEsPersona();
    }

    public static Comparador JuntarOR(Comparador A, Comparador B) {
        OperadorLógico op = new OperadorOR();
        if (A == null) {
            return B;
        }
        if (B == null) {
            return A;
        }

        op.setA(A);
        op.setB(B);

        return op;
    }

    public static Comparador JuntarAND(Comparador A, Comparador B) {
        OperadorLógico op = new OperadorAND();
        if (A == null) {
            return B;
        }
        if (B == null) {
            return A;
        }

        op.setA(A);
        op.setB(B);
        return op;
    }

    public static Comparador FiltrarPorCategoria(String categoria) {
        CompararPorMatch comparador = new CompararPorMatch();
        ExtraerRubros extractor = new ExtraerRubros();

        comparador.setA(extractor);
        comparador.setB(new ExtraerCadenaFija(".*" + categoria + ".*"));

        return comparador;
    }

    public static Comparador CompararContraTextoParaBuscar(String texto, Extractor extractor) {
        CompararPorMatch comparador = new CompararPorMatch();
        ExtraerCadenaFija cadena = new ExtraerCadenaFija(texto);

        // Se puede optimizar haciendo que el objeto cadena se pase por parametro
        comparador.setA(extractor);
        comparador.setB(cadena);
        return comparador;

    }

    public static Comparador FiltrarTexto(String texto) {
        ExtraerNombre nombre = new ExtraerNombre();
        ExtraerRazonSocial razon = new ExtraerRazonSocial();

        return (JuntarOR(CompararContraTextoParaBuscar(texto, razon),
                CompararContraTextoParaBuscar(texto, nombre)));
    }
}
